<?php
namespace app\wechat\controller;
use think\Controller;
use app\common\model\User;
use app\common\model\Order;
use app\common\model\Logs;
use app\common\model\Wepay;
use app\common\model\Relation;
use app\common\model\User_account;
use app\common\model\Message;
Vendor('WxPayApi.WxPay#JsApiPay');
Vendor('WxPayApi.lib.WxPay#Notify');
class Notify extends Controller{

	public function __construct(){

	    parent::__construct();
    }

    /**
     * 微信支付回调返回
     *  appid           公众账号ID
     *  bank_type       付款银行
     *  cash_fee        支付金额(分)
     *  fee_type        货币类型(CNY:人民币)
     *  is_subscribe    是否关注公众账号 (Y:关注  N:未关注)
     *  mch_id          商户号
     *  nonce_str       随机字符串
     *  openid          用户标识
     *  out_trade_no    商户订单号
     *  result_code     业务结果(SUCCESS/FAIL)
     *  return_code     返回状态码,SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
     *  sign            签名String(32)
     *  time_end        支付完成时间 格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010
     *  total_fee       订单金额(分)
     *  trade_type      交易类型 JSAPI、NATIVE、APP
     *  transaction_id  微信支付订单号String(32)
     */
    public function notifyback(){

        $notifyModel = new \WxPayNotify();
        //验证
        $notifyModel->Handle(false);
        //获取验证的返回值
        $result = $notifyModel->GetValues();

        if($result['return_code']=='SUCCESS' && $result['return_msg']=='OK'){
            //回调成功进行 处理
            $xml = file_get_contents('php://input');
            $xml = xml2Array($xml);

            if($xml){
                //查询订单是否支付成功 且订单是否正确
                $wepay = new Wepay();
                $res = $wepay->Queryorder($xml['out_trade_no']);
                if($res['result_code']=='SUCCESS' && $res['return_code']=='SUCCESS'){
                    if($res['trade_state']=='SUCCESS'){
                        //支付成功时
                        $user = new User();
                        $uinfo = $user->getOne('uid,name',['third_id'=>$xml['openid']]);
                        if($uinfo){
                            $userAccount = new User_account;
                            $account = $userAccount->getOne(['oid'=>$xml['out_trade_no']],'*');
                            if($account){
                                if($account['amount']==$xml['cash_fee']){

                                    $where = ['oid'=>$xml['out_trade_no']];
                                    $save = ['pmoney'=>$xml['cash_fee'],'state'=>2,'pt'=>time()];
                                    $userAccount->where($where)->update($save);

                                    $cash_fee = $xml['cash_fee']/100;
                                    if($account['type']==1){
                                        //资源人 认证
                                        $place = config('PLACE');
                                        $relationModel = new Relation();
                                        $rwhere = [
                                            'auth'=>0,
                                            'uid'=>$uinfo['uid'],
                                            'rid'=>['in', [$place['PLACE_RMAN_OPEN']['id'], $place['PLACE_RMAN_AYS']['id']]]
                                        ];
                                        $relationModel->where($rwhere)->update(['auth'=>1]);

                                        //查出推荐人  并且发消息
                                        unset($rwhere['auth']);
                                        $infos = $relationModel->getOne($rwhere);
                                        
                                        $con = '您的资源人：'.$uinfo['name'].' '.date('Y-m-d H:i:s',time()).'已交认证费'.$cash_fee.'元';
                                        $messageModel = new Message();
                                        $messageModel->sendMessage(0,$infos['referral'],$con,6,'');
                                    }

                                    $logsModel = new Logs();
                                    $content = '微信支付：'.$uinfo['name'].' '.$xml['out_trade_no'].' '.$cash_fee;
                                    $logsModel->addOrderLog($content);
                                }
                            }
                        }
                    }
                }
            }
        }

        //返回给微信
        echo $notifyModel->ToXml();
    }

    /**
     * 微信支付模式一回调地址
     *  appid           公众账号ID
     *  is_subscribe    是否关注公众账号 (Y:关注  N:未关注)
     *  mch_id          商户号
     *  nonce_str       随机字符串
     *  openid          用户标识
     *  product_id      商品ID
     *  sign            签名
     * @return [type] [description]
     */
    public function oneBack(){
        // 接收微信参数
        $xml = file_get_contents('php://input');

        $resultsModel = new \WxPayResults();

        $result = $resultsModel->Init($xml);

        //提取product_id
        $product_id = $result["product_id"];
        $openId = $result["openid"];


        $input = new \WxPayUnifiedOrder();
        $configModel = new \WxPayConfig();
        $payApi = new \WxPayApi();
        $jsApi = new \JsApiPay();

        //支付成功回调地址
        $notify_url = config("WECHAT_NOTIFY_URL");

        //商品或支付单简要描述
        $input->SetBody("实唯科技-燃气报警器");

        //设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $payOrderTrade = $configModel->MCHID.date("YmdHis");
        $input->SetOut_trade_no($payOrderTrade);
        //设置订单总金额，只能为整数，详见支付金额 （单位为:分）
        $input->SetTotal_fee("1");
        //设置订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010
        $input->SetTime_start(date("YmdHis"));
        //设置订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为2009122709101
        $input->SetTime_expire(date("YmdHis", time() + 600));
        
        $input->SetProduct_id($product_id);

        //设置接收微信支付异步通知回调地址
        $input->SetNotify_url($notify_url);
        //设置取值如下：JSAPI，NATIVE，APP
        $input->SetTrade_type("NATIVE");
        //设置trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid
        $input->SetOpenid($openId);
        //生成订单
        $order = $payApi->unifiedOrder($input);
        
        echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[SUCCESS]]></return_msg><prepay_id><![CDATA['.$order["prepay_id"].']]></prepay_id></xml>';

        // echo '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>';
    }

}
